<!--
 * @Author: weidewei
 * @Date: 2025-10-29 14:38:57
 * @LastEditors: weidewei
 * @LastEditTime: 2025-10-29 17:14:59
 * @Description: 
 * @FilePath: \2025-front-face\js\执行上下文.html
-->
<script>
  // 执行上下文：在执行上下文中，我们目前仅需关心其中一件“物品”——AO（Activation Object），称之为活动对象，在调用函数时，会先往AO里面放一些东西，放完后再执行函数
  // AO的创建顺序：1.确认参数，同时确认arguments 2.提取函数声明：若遇到同名问题直接覆盖 3.提取变量声明：值为undefined。若遇到同名问题，忽略。

  function method(foo) {
    // 提升后：foo = function() { console.log("C"); }

    console.log(foo); // 输出：function foo() { console.log("C"); }

    var foo = "A"; // 重新赋值：foo = "A"
    var foo = function () {
      // 重新赋值：foo = function() { console.log("B"); }
      console.log("B");
    };

    foo(); // 执行当前 foo：输出 "B"

    function foo() {
      // 提升阶段已处理，此处忽略
      console.log("C");
    }

    foo(); // 执行当前 foo：输出 "B"
  }
  function method(a, b, c) {
    console.log(a, b, c); // 1,2,3 变量同名，变量提升忽略不覆盖
    var a = "a";
    var b = function b() {};

    (function a() {});
    (function b() {});
    (function c() {});
    console.log(a, b, c); // a fn 3
  }
  method(1, 2, 3);

  function test(a, b) {
    arguments[0]++;
    console.log(a, b); // 2,fn;2,fn
    var a = function () {};
    console.log(arguments[0] === a, arguments[1] === b); // true false;true,true
    function b() {}
  }
  test(1);
  test(1, undefined);

  第一次执行AO = {
    args: [2, fn],
    a: 2,
    b: fn,
  };

  第二次执行AO = {
    args: [fn, fn],
    a: fn,
    b: fn,
  };

  var x = 1;
  function test() {
    console.log(x);
    if (false) {
      var x = 2;
      function foo() {}
    }
    console.log(x);
    console.log(typeof foo); // undefined
  }
  test(); 
  console.log(x); // 1

  AO = {
    args: [],
  }
</script>
